import mailer from 'nodemailer';
import smtpTransport from 'nodemailer-smtp-transport';
import util from 'util';
import config from '../config';
import logger from './logger';

const transporter = mailer.createTransport(smtpTransport(config.mail_opts));

import { web_host, apiPrefix } from '../../config';

const SITE_ROOT_URL = `http://${web_host}${apiPrefix.page}`;

export {
  sendMail,
  sendActiveMail,
  sendResetPassMail
};

/**
 * Send an email
 * @param {Object} data 邮件对象
 */
function sendMail(data) {
  // 遍历邮件数组，发送每一封邮件，如果有发送失败的，就再压入数组，同时触发mailEvent事件
  transporter.sendMail(data, (err) => {
    if (err) {
      // 写为日志
      logger.error(err);
    }
  });
}

/**
 * 发送激活通知邮件
 * @param {String} who 接收人的邮件地址
 * @param {String} token 重置用的token字符串
 * @param {String} name 接收人的用户名
 */
function sendActiveMail(who, token, loginname) {
  const from = util.format('%s <%s>', config.name, config.mail_opts.auth.user);
  const to = who;
  const subject = `${config.name}社区帐号激活`;
  const html = `<p>您好：${loginname}</p>` +
    `<p>我们收到您在${config.name}社区的注册信息，请点击下面的链接来激活帐户：</p>` +
    `<a href  = "${SITE_ROOT_URL}/user/activeAccount?key=${token}&name=${loginname}">激活链接</a>` +
    `<p>若您没有在${config.name}社区填写过注册信息，说明有人滥用了您的电子邮箱，请删除此邮件，我们对给您造成的打扰感到抱歉。</p>` +
    `<p>${config.name}社区 谨上。</p>`;

  sendMail({
    from,
    to,
    subject,
    html,
  });
}

/**
 * 发送密码重置通知邮件
 * @param {String} who 接收人的邮件地址
 * @param {String} token 重置用的token字符串
 * @param {String} loginname 接收人的用户名
 */
function sendResetPassMail(who, token, loginname) {
  const from = util.format('%s <%s>', config.name, config.mail_opts.auth.user);
  const to = who;
  const subject = `${config.name}社区密码重置`;
  const html = `<p>您好：${loginname}</p>` +
    `<p>我们收到您在${config.name}社区重置密码的请求，请在24小时内单击下面的链接来重置密码：</p>` +
    `<a href="${SITE_ROOT_URL}/user/inputPasswordFromMail?key=${token}&loginname=${loginname}">重置密码链接</a>` +
    `<p>若您没有在${config.name}社区填写过注册信息，说明有人滥用了您的电子邮箱，请删除此邮件，我们对给您造成的打扰感到抱歉。</p>` +
    `<p>${config.name}社区 谨上。</p>`;

  sendMail({
    from,
    to,
    subject,
    html,
  });
}
